﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using UOL.PagSeguro;
using System.Configuration;

using MakeIT.Deo.Negocios;
using System.Net.Mail;
using System.Net;

namespace MakeIT.Deo.Apresentacao
{
    public partial class RetornoPagSeguro : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            //Valor somente para testes
            //Na compila&ccedil;&atilde;o para release essa linha deve ser suprimida.
            this.RetornoPagSeguro1.UrlNPI = ConfigurationManager.AppSettings["PagSeguro.URLRetorno"];
            this.RetornoPagSeguro1.Token = ConfigurationManager.AppSettings["PagSeguro.Token"];

            Response.AppendHeader("Refresh", "5; URL=AreaCliente.aspx");
        }

        /* Mesmo se o usuario voltar para a pagina principal ou continuar navegando em outros sites
        este metodo é chamado e não serve para dar nenhum display ao usuário, apenas coletar
        informações sobre o pedido */

        protected void RetornoPagSeguro1_VendaEfetuada(UOL.PagSeguro.RetornoVenda retornoVenda)
        {
            //Obtendo o número do Pedido (que é na verdade o IdCliente)
            int idCliente = int.Parse(retornoVenda.CodigoReferencia);

            ClienteBO cliBO = new ClienteBO();
            cliente cliVO = cliBO.RecuperaCliente(idCliente);

            //Obtendo detalhes da transa&ccedil;&atilde;o
            string codigo_transacao = retornoVenda.CodigoTransacao;
            string status_transacao = retornoVenda.StatusTransacaoDescricao;
            string tipo_pagamento = retornoVenda.TipoPagamentoDescricao;
            string anotacao_cliente = retornoVenda.Anotacao;
            
            //recuperando os produtos vendidos (que são na verdade os IdDebito´s)
            List<Produto> listaProdutos = retornoVenda.Produtos;

            DebitoBO debitoBO = new DebitoBO();

            foreach (Produto prod in listaProdutos)
            {
                debito deb = debitoBO.RecuperaDebito(int.Parse(prod.Codigo));

                string hist = (deb.Historico == null ? "" : deb.Historico);
                hist += DateTime.Now.ToString() + " ==>Transa&ccedil;&atilde;o: "+codigo_transacao+ "\n" +
                                                  " ==> Situa&ccedil;&atilde;o: " + status_transacao + "\n";
                                    //UOL.PagSeguro.StatusTransacao.AguardandoPagamento
                                    //UOL.PagSeguro.StatusTransacao.Aprovada
                                    //UOL.PagSeguro.StatusTransacao.Cancelada
                                    //UOL.PagSeguro.StatusTransacao.Completa
                                    //UOL.PagSeguro.StatusTransacao.EmAnalise

                deb.Status = status_transacao;
                if (retornoVenda.StatusTransacao == UOL.PagSeguro.StatusTransacao.Completa)
                {
                    hist += DateTime.Now.ToString() + " ====>Tipo Pagamento: " + tipo_pagamento + "\n" +
                            DateTime.Now.ToString() + " ======>Valor: " + prod.Valor.ToString() + "\n" +
                            DateTime.Now.ToString() + " ======>Valor extra: " + prod.ValorExtra.ToString() + "\n" +
                            DateTime.Now.ToString() + " ====>Anota&ccedil;&atilde;o do Cliente: " + anotacao_cliente + "\n";
                    deb.Status = "Completo";
                }
                if (retornoVenda.StatusTransacao == UOL.PagSeguro.StatusTransacao.Cancelada)
                    deb.Status = "Em aberto";

                                    //UOL.PagSeguro.TipoPagamento.Boleto
                                    //UOL.PagSeguro.TipoPagamento.CartaoCredito
                                    //UOL.PagSeguro.TipoPagamento.PagSeguro
                                    //UOL.PagSeguro.TipoPagamento.TransferenciaOnline

                //Atualizar na base de dados o status do pedido e as outras informações
                deb.Historico = hist;
                debitoBO.SalvarDebito(deb, false);
            }

            sendEmail(cliVO);
        }

        protected void sendEmail(cliente clienteVO)
        {
            MailMessage oEmail = new MailMessage();
            MailAddress sDe = new MailAddress(ConfigurationManager.AppSettings["Email.Administrador"]);

            oEmail.To.Add(ConfigurationManager.AppSettings["Email.Notificacao.Pagamento"]);
            oEmail.From = sDe;
            oEmail.Priority = MailPriority.Normal;
            oEmail.IsBodyHtml = false;
            oEmail.Subject = "Retorno recebido do Pag-Seguro";
            oEmail.Body = "Foi recebida uma notifica&ccedil;&atilde;o de atualiza&ccedil;&atilde;o de Situa&ccedil;&atilde;o de débito do cliente:\n\n\n" +
                          "Cliente: " + clienteVO.Nome + "\n" +
                          "*Este email foi enviado automaticamente pelo site - " + DateTime.Now.ToString();

            SmtpClient oEnviar = new SmtpClient();
            oEnviar.Host = ConfigurationManager.AppSettings["Email.Host.SMTP"];
            oEnviar.Port = int.Parse(ConfigurationManager.AppSettings["Email.Host.SMTP.Port"]);
            oEnviar.Credentials = new NetworkCredential(
                                            ConfigurationManager.AppSettings["Email.Administrador"],
                                            ConfigurationManager.AppSettings["Email.Administrador.Pass"]);
            oEnviar.Send(oEmail);
            oEmail.Dispose();
        }
    }
}
